/*
* 解析AST语法树，转换成源码，将ES6转换成ES5，分析依赖
*/
const fs = require('fs');  // 引入node中fs模块
const babylon = require('babylon'); // 通过 Babylon 生成AST
const traverse = require('babel-traverse').default; //通过 babel-traverse 的 ImportDeclaration方法获取依赖属性
const { transformFromAst } = require('babel-core'); //通过 babel-core 将AST 重新生成源码


module.exports = {
  // 生成AST树
  getAST: path => {
    // 同步读取文件
    const source = fs.readFileSync(path, 'utf-8');
    // 使用babylon的parse方法进行生成AST
    return babylon.parse(source, {
      sourceType: 'module',
    });
  },
  // 获取依赖
  getDependencies: ast => {
    const dependencies = [];
    traverse(ast, {
      // ImportDeclaration：分析import语句
      ImportDeclaration: ({ node }) => {
        // 将依赖push到dependencies中
        dependencies.push(node.source.value);
      },
    }); 
    return dependencies;
  },
  // 代码生成
  transform: ast => {
    const { code } = transformFromAst(ast, null, {
      presets: ['env'],
    });
    return code;
  }
};
